#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>

//中缀转成后缀表达式后，像计算后缀表达式一样，创个栈，然后两个数左右节点，操作符是根，将根节点入栈，重复操作树就建好了
typedef struct node
{
	char _str[20];
	struct node* _left;
	struct node* _right;
	
}node;

typedef struct
{
	char _a[20];
	int _n;
}Signal_St;

typedef struct
{
	node* _a[20];
	int _n;
}Data_St;

int prior(char ch)
{
	if(ch=='+'||ch=='-') return 1;
	else return 2;
}


Data_St data_st;

int i=0;//递归到哪个字符
void dfs(char* s)
{
	Signal_St st;
	st._n=0;
	
	while(i<strlen(s))
	{
		if(isdigit(s[i]))
		{
			int begin=0;
			char tmp[20]={0};
			while(i<strlen(s) &&isdigit(s[i]) )
			{
				tmp[begin++]=s[i++];
			}
			
			node* p=(node*)malloc(sizeof(node));
			p->_left=p->_right=NULL;
			strcpy(p->_str,tmp);
			
			data_st._a[data_st._n++]=p;
		}
		else if(s[i]=='(')
		{
			i++;
			dfs(s);
		}
		else if(s[i]==')')
		{
			i++;
			
			while(st._n!=0)
			{
				node* p=(node*)malloc(sizeof(node));
				
				node* p1=data_st._a[data_st._n-1];
				data_st._n--;
				node* p2=data_st._a[data_st._n-1];
				data_st._n--;
				
				p->_left=p2;
				p->_right=p1;
				
				p->_str[0]=st._a[st._n-1];
				p->_str[1]='\0';
				
				st._n--;
				
				data_st._a[data_st._n]=p;
				data_st._n++;
				
			}
			return ;
		}
		else
		{
			if(st._n==0 || ( prior(st._a[st._n-1])<prior(s[i]) ))
			{
				st._a[st._n]=s[i];
				st._n++;
			}
			else
			{
				while(st._n!=0 &&prior(st._a[st._n-1])>=prior(s[i]))
				{
					node* p=(node*)malloc(sizeof(node));
					
					node* p1=data_st._a[data_st._n-1];
					data_st._n--;
					node* p2=data_st._a[data_st._n-1];
					data_st._n--;
					
					p->_left=p2;
					p->_right=p1;
					
					p->_str[0]=st._a[st._n-1];
					p->_str[1]='\0';
					
					st._n--;
					
					data_st._a[data_st._n]=p;
					data_st._n++;
				}
				
			    st._a[st._n]=s[i];
				st._n++;
			}
			i++;
		}
	}
	
	while(st._n!=0)
	{
		node* p=(node*)malloc(sizeof(node));
		
		node* p1=data_st._a[data_st._n-1];
		data_st._n--;
		node* p2=data_st._a[data_st._n-1];
		data_st._n--;
		
		p->_left=p2;
		p->_right=p1;
		
		p->_str[0]=st._a[st._n-1];
		p->_str[1]='\0';
		
		st._n--;
		
		data_st._a[data_st._n]=p;
		data_st._n++;
		
	}
	
}

int dfs_back(node* root)
{
	if(root->_left==NULL &&root->_right==NULL)  return atoi(root->_str);//是叶子
	else
	{
		int num1=dfs_back(root->_left);
		int num2=dfs_back(root->_right);
		if(root->_str[0]=='+')
		{
			return num1+num2;
		}
		else if(root->_str[0]=='-')
		{
			return num1-num2;
		}
		else if(root->_str[0]=='/')
		{
			return num1/num2;
		}
		else 
		{
			return num1*num2;
		}
	}

	
	
}


int main()
{

	
	char s[50];
	while(1)
	{
		//初始化data_st
	    data_st._n=0;
		
		i=0;
		gets(s);
		if(!strcmp(s,"=")) break;
		
		int begin1=0;
		char tmp[50]={0};
		for(int i=0;i<strlen(s);i++)
		{
			if(s[i]!=' ')
			{
				tmp[begin1++]=s[i];
			}
		}
		int begin2=0;
		memset(s,0,sizeof(s));
		for(int i=0;i<strlen(tmp);i++)
		{
			if(tmp[i]=='-'&&(i==0||tmp[i-1]=='(') )
			{
				s[begin2++]='0';	
				s[begin2++]='-';
			}
			else
			{
				s[begin2++]=tmp[i];
			}
		}
		dfs(s);
		
		//printf("%s",(data_st._a[0])->_str);
		printf("%d\n\n",dfs_back(data_st._a[0]) );
		
	}
	return 0;
}